自作iOSアプリからmixi2アプリに画像を共有する際の実装ポイント

自作iOSアプリからmixi2アプリに画像を共有する際の実装ポイント

Clock Icon2024.12.16

2024年12月16日に「mixi2」がリリースされた。早速招待を受けてアカウントを作成し、知人をフォローした。初期のTwitterに似た雰囲気を感じた。

https://apps.apple.com/jp/app/mixi2/id6475064197

本記事では、自作iOSアプリからmixi2に画像を共有する際の実装方法と注意点について解説する。

自作iOSアプリからmixi2アプリに画像とハッシュタグを共有できない

自作iOSアプリからmixi2アプリへ画像とハッシュタグを共有しようとした際、画像が認識されず、ハッシュタグのみが表示される問題が発生した。

画像の受け取りは、共有先アプリ側の実装によってサポートされるフォーマットが異なる。過去のSNSアプリへの画像や動画共有の調査経験から、受け取り可能なフォーマットにはアプリごとに違いがあることが分かっている。

詳細については「自作アプリからSNSアプリへ画像を共有する最適なフォーマットは?UIImage、Data、URL の比較調査した」を参考のこと。

https://dev.classmethod.jp/articles/what-is-the-best-format-to-share-to-sns-applications

私が開発しているiOSアプリでは、各SNSアプリのBundle IDを調査し、それぞれのアプリに適したフォーマットでメディアを共有している。以下の表は、調査時点での各アプリの挙動をまとめたものである。

共有先 メディアタイプ UIActivityItemSource のitemの型 備考
カメラロール 静止画 URL
カメラロール 動画 URL
Twitter(現X) 静止画 URL
Twitter(現X) 動画 URL
Bluesky 静止画 UIImage ハッシュタグを一緒に渡すとBlueskyアプリがクラッシュする
Bluesky 動画 共有できない
Mastodon 静止画 Data
Mastodon 動画 URL
Threads 静止画 UIImage ハッシュタグは無視される
Threads 動画 共有できない
Instagram 静止画 URL ハッシュタグを一緒に渡すとエラーが発生する
Instagram 動画 URL ハッシュタグを一緒に渡すとエラーが発生する
mixi2 🆕 静止画 UIImage
mixi2 🆕 動画 共有できない 灰色のダイアログが表示される

mixi2アプリへ画像を共有するための実装方法

まず、mixi2アプリの固有アクティビティタイプ(Bundle ID)を定義する必要がある。以下のコードで定義を追加する。

extension UIActivity.ActivityType {
    static let mixi = UIActivity.ActivityType(rawValue: "jp.co.mixi.mercury.ShareExtension")
}

次に、mixi2アプリでは UIImage オブジェクトを直接渡すことで画像を認識できることが判明した。そのため、アクティビティタイプが mixi の場合には UIImage を渡し、それ以外の場合にはファイルURLを渡すように設定する。以下は実装例である。

import LinkPresentation
import UIKit
import UniformTypeIdentifiers

final class ImageFileActivityItem: NSObject, UIActivityItemSource {
    let fileUrl: URL
    let fileName: String
    let image: UIImage?

    init(fileUrl: URL, image: UIImage?) {
        self.fileUrl = fileUrl
        self.image = image
        self.fileName = fileUrl.lastPathComponent
    }

    func activityViewControllerPlaceholderItem(_: UIActivityViewController) -> Any {
        image ?? UIImage()
    }

    func activityViewController(_: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        return switch activityType {
        case .mixi:
            image
        default:
            fileUrl
        }
    }

    func activityViewController(_: UIActivityViewController, subjectForActivityType _: UIActivity.ActivityType?) -> String {
        fileName
    }

    func activityViewController(_: UIActivityViewController, dataTypeIdentifierForActivityType _: UIActivity.ActivityType?) -> String {
        UTType.image.identifier
    }

    func activityViewControllerLinkMetadata(_: UIActivityViewController) -> LPLinkMetadata? {
        guard let image = image else { return nil }

        let metadata = LPLinkMetadata()
        metadata.title = fileName
        metadata.imageProvider = NSItemProvider(object: image)
        return metadata
    }
}

このコードでは、UIActivityViewController を使用して画像を他のアプリ(本記事ではmixi2が対象)に共有するためのカスタムクラス ImageFileActivityItem を実装している。UIActivityItemSource プロトコルを利用し、共有先アプリに応じて適切なデータを提供する仕組みとなっている。

修正後の動作確認

以下は、修正後に画像とハッシュタグを共有した際の投稿画面のスクリーンショットである。

20241216162748

画像とハッシュタグがmixi2アプリの投稿画面に正しく表示されていることが確認できる。

mixi2アプリの開発者の方へ

リリースお疲れ様でした! Twitter(現X)方式(file:///var/mobile〜で始まるURL)やMastodonアプリ方式(Data)での画像受け取りのサポートをご検討いただければ幸いです。さらに、画像が3枚までしか共有できない点や、写真アプリからも動画を共有できない点など修正していただければとても嬉しいです!

まとめ

本記事では、自作iOSアプリからmixi2アプリに画像を共有する際の実装方法について解説した。UIActivityViewController を利用し、mixi2アプリ固有のフォーマットに対応することで、画像とハッシュタグを正しく共有できるようになった。

この記事が、自作アプリからmixi2アプリへの画像共有機能を実装する際の参考になれば幸いである。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.